{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 词向量\n",
    "- 基本用法\n",
    "- 文本生成\n",
    "- 可视化\n",
    "- 字向量"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 基本用法\n",
    "https://blog.csdn.net/Yellow_python/article/details/84347878"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from warnings import filterwarnings\n",
    "filterwarnings('ignore')  # 不打印警告\n",
    "from jieba import lcut\n",
    "from gensim.models import Word2Vec"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'北京时间TIMETIME晚，赛季cba联赛继续第轮角逐，坐镇主场的北京男篮经过四节较量以战胜广厦男篮，取得连胜并报了常规赛上半程不敌对手的一箭之仇'"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 数据读取\n",
    "with open('news.txt', encoding='utf-8') as f:\n",
    "    sentences = [lcut(s) for s in f.read().strip().split('\\n')]\n",
    "''.join(sentences[-1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 建模训练\n",
    "model = Word2Vec(sentences, window=9)\n",
    "wv = model.wv"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "参数 | 解释 | 默认值\n",
    "-|-|-\n",
    "sentences | list of lists of tokens | None\n",
    "size | 词向量维数 | 100\n",
    "window | 同句中当前词和预测词的最大距离 | 5\n",
    "min_count | 最低词频过滤 | 5\n",
    "workers | 线程数 | 3\n",
    "sg | 0：CBOW；1：skip-gram | 0\n",
    "hs | 1：层次softmax；0：负例采样 | 0\n",
    "negative | 负例样本数 | 5\n",
    "ns_exponent | The exponent used to shape the negative sampling distribution | 0.75\n",
    "cbow_mean | 0：上下文词向量求和值；1：上下文词向量平均值 | 1\n",
    "alpha | 初始学习率 | 0.025\n",
    "min_alpha | 最小学习率 | 0.0001"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[('证件', 0.919139564037323),\n",
       " ('准考证', 0.9092125296592712),\n",
       " ('原件', 0.89948970079422),\n",
       " ('书面材料', 0.889183759689331)]"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "wv.similar_by_word('身份证', topn=4)  # 某个词的相似词"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.90921247"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "wv.similarity('身份证', '准考证')  # 两个词的相似度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(100,)"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "wv.get_vector('身份证').shape  # 词 --> 词向量（维度查看）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[('身份证', 1.0), ('证件', 0.919139564037323), ('准考证', 0.9092125296592712)]"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "wv.similar_by_vector(vec, 3)  # 某个词向量的相似词"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(67489, 100)"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "wv.vectors.shape  # 词向量集（词矩阵）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['，', '的', '在', '了', '是', '和', 'TIME', '：', '也', '有', '中国', '为', '将', '与', '中']"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "wv.index2word[:15]  # 词列表（部分展示）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "67489"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "wv.index2word.__len__()  # 词总数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[('准考证', 0.052992545),\n",
       " ('身份证', 0.040961884),\n",
       " ('查询', 0.023644874),\n",
       " ('办理', 0.021465328),\n",
       " ('填写', 0.016910722)]"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.predict_output_word(['身份证', '准考证'], 5)  # 用句子来预测词"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 文本生成（写诗小程序）\n",
    "https://blog.csdn.net/Yellow_python/article/details/86726619"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Software\\Anaconda3\\lib\\site-packages\\gensim\\utils.py:1209: UserWarning: detected Windows; aliasing chunkize to chunkize_serial\n",
      "  warnings.warn(\"detected Windows; aliasing chunkize to chunkize_serial\")\n"
     ]
    }
   ],
   "source": [
    "from gensim.models import Word2Vec  # 词向量\n",
    "from random import choice\n",
    "from os.path import exists\n",
    "from warnings import filterwarnings\n",
    "filterwarnings('ignore')  # 不打印警告"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "class CONF:\n",
    "    path = 'poem.txt'  # 语料路径\n",
    "    window = 16  # 滑窗大小\n",
    "    min_count = 60  # 过滤低频字\n",
    "    size = 125  # 词向量维度\n",
    "    topn = 14  # 生成诗词的开放度\n",
    "    model_path = 'word2vec'  # 模型路径"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Model:\n",
    "    def __init__(self, window, topn, model):\n",
    "        self.window = window\n",
    "        self.topn = topn\n",
    "        self.model = model  # 词向量模型\n",
    "        self.chr_dict = model.wv.index2word  # 字典\n",
    "    \"\"\"模型初始化\"\"\"\n",
    "    @classmethod\n",
    "    def initialize(cls, config):\n",
    "        if exists(config.model_path):\n",
    "            model = Word2Vec.load(config.model_path)  # 模型读取\n",
    "        else:\n",
    "            # 语料读取\n",
    "            with open(config.path, encoding='utf-8') as f:\n",
    "                ls_of_ls_of_c = [list(line.strip()) for line in f]\n",
    "            # 模型训练和保存\n",
    "            model = Word2Vec(ls_of_ls_of_c, config.size, window=config.window, min_count=config.min_count)\n",
    "            model.save(config.model_path)\n",
    "        return cls(config.window, config.topn, model)\n",
    "    \"\"\"古诗词生成\"\"\"\n",
    "    def poem_generator(self, title, form):\n",
    "        # list_of_tuples --> list_of_strings 并过滤标点符号\n",
    "        filter = lambda lst: [t[0] for t in lst if t[0] not in ['，', '。']]\n",
    "        # 标题补全\n",
    "        if len(title) < 4:\n",
    "            if not title:\n",
    "                title += choice(self.chr_dict)\n",
    "            for _ in range(4 - len(title)):\n",
    "                chrs = self.model.similar_by_word(title[-1], self.topn // 2)\n",
    "                chrs = filter(chrs)\n",
    "                char = choice([c for c in chrs if c not in title])\n",
    "                title += char\n",
    "        # 文本生成\n",
    "        seq = list(title)\n",
    "        for i in range(form[0]):\n",
    "            for _ in range(form[1]):\n",
    "                chrs = self.model.predict_output_word(seq[-self.window:], max(self.topn, len(seq) + 1))\n",
    "                chrs = filter(chrs)\n",
    "                char = choice([c for c in chrs if c not in seq[len(title):]])\n",
    "                seq.append(char)\n",
    "            seq.append('，' if i % 2 == 0 else '。')\n",
    "        # 返回标题+主体\n",
    "        length = form[0] * (form[1] + 1)\n",
    "        title = '《%s》' % ''.join(seq[:-length])\n",
    "        poem = ''.join(seq[-length:])\n",
    "        return title + '\\n' + poem"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "form = {'五言绝句': (4, 5), '七言绝句': (4, 7), '对联': (2, 9)}\n",
    "m = Model.initialize(CONF)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "def poetize(title):\n",
    "    poem = m.poem_generator(title, form['五言绝句'])\n",
    "    print('\\033[031m%s\\033[0m' % poem)  # red\n",
    "    poem = m.poem_generator(title, form['七言绝句'])\n",
    "    print('\\033[033m%s\\033[0m' % poem)  # yellow\n",
    "    poem = m.poem_generator(title, form['对联'])\n",
    "    print('\\033[036m%s\\033[0m' % poem)  # purple"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[031m《春催迟频》\n",
      "催晓暖睡漏，曙鸡腊残焰。钟候晨烛寒，火暑冬暄温。\u001b[0m\n",
      "\u001b[033m《春梅萸萏》\n",
      "蕊樱枝折红嫩绽，叶香莲摘杏艳粉。丛芳浓蝶花梨蜂，繁蕙蒂灼妒茸槿。\u001b[0m\n",
      "\u001b[036m《春柳袅细》\n",
      "袅柔絮堤细弱丝腰纤，条杨垂绿折软蔓嫩线。\u001b[0m\n"
     ]
    }
   ],
   "source": [
    "poetize('春')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[031m《杀破狼擒》\n",
      "狐血狼兵蕃，战军弓豺杀。戈烽戎虏旗，阵营屯矛马。\u001b[0m\n",
      "\u001b[033m《杀破狼狐》\n",
      "猛戈豺虏弓贼军，阵营狼蕃虎铁兵。鼙射马勇防猎烽，蹄戎箭鞍骑旗旆。\u001b[0m\n",
      "\u001b[036m《杀破狼猛》\n",
      "杀妖虏勇狐戈贼狼血，豺弓猛锋兵虎防铁战。\u001b[0m\n"
     ]
    }
   ],
   "source": [
    "poetize('杀破狼')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[031m《御剑飞仙》\n",
      "蓬鹤凰羽霄，凤翩翔鹓鸳。凫翼翮鸾雏，矫翅巢雀鸯。\u001b[0m\n",
      "\u001b[033m《御剑飞仙》\n",
      "羽仗鸾霓鹓凤翩，翮双翔鸳飞鹤雏。鹭鹄凰翎翼翅鸯，雀鹦燕鹉鸢乌啄。\u001b[0m\n",
      "\u001b[036m《御剑飞仙》\n",
      "仗列俨旗幢旒彤鸾殿，凤龙羽翔翼彩凰旌翮。\u001b[0m\n"
     ]
    }
   ],
   "source": [
    "poetize('御剑飞仙')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[031m《欢尊斟沽》\n",
      "罍饮樽壶觞，酣宴酒醒醉。娱杯欢斟尊，卮瓮筵歌席。\u001b[0m\n",
      "\u001b[033m《欢杯壶缸》\n",
      "宴酒醒杯樽醉劝，饮娱壶欢觞卮罍。酣倾筵席觥酌斟，琴醺瑟醪尊座宾。\u001b[0m\n",
      "\u001b[036m《欢筵宾僚》\n",
      "筵洽宾樽酌宴酒娱杯，席卮酣觞斟饮醉罍劝。\u001b[0m\n"
     ]
    }
   ],
   "source": [
    "poetize('欢')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[031m《晚年衰悲》\n",
      "凋冉蹉早倍，跎衰病岁壮。颜憔髭鬓改，容霜筋质肌。\u001b[0m\n",
      "\u001b[033m《晚年时曾》\n",
      "忆记岁他跎蹉早，少鬓年宦壮十昔。悴憔今衰改辛髭，斑叹筋悲咨酸零。\u001b[0m\n",
      "\u001b[036m《晚年蹉跎》\n",
      "悴冉凋跎壮年华蹉憔，宦志叹弱岁辛鬓毛筋。\u001b[0m\n"
     ]
    }
   ],
   "source": [
    "poetize('晚年')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[031m《皇妃娥妆》\n",
      "宫女娇殿阿，娃妒母王娥。妆蛾舞眉妃，鬟娟歌艳婵。\u001b[0m\n",
      "\u001b[033m《皇妃珠珑》\n",
      "窕女玉金佩银珮，缕殿珊绣宫钿罗。珠钗裙宝绡蛾脂，妆锦绮翠织袜婵。\u001b[0m\n",
      "\u001b[036m《皇妃娃娇》\n",
      "娇侍玉妃妾钗金佩裙，银妇钿女蛾缕鬟妆娥。\u001b[0m\n"
     ]
    }
   ],
   "source": [
    "poetize('皇妃')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[031m《涟漪涵溶》\n",
      "荡澹浩波滟，浪漾涛鳞澜。漪摇鲸舟漂，溟楫钓泊沧。\u001b[0m\n",
      "\u001b[033m《涟漪漾涵》\n",
      "浩渺澜澹泛澄蘋，浪舟扁涛楫波棹。沧钓鳞桡屿鱼船，渔鹢矶漾鲈汀岛。\u001b[0m\n",
      "\u001b[036m《涟漪漾洄》\n",
      "漾舟洄扁桡楫艇泛渔，浦沿岸钓屿汀棹浪沧。\u001b[0m\n"
     ]
    }
   ],
   "source": [
    "poetize('涟漪')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "\"\"\"创建随机数据\"\"\"\n",
    "from random import choice\n",
    "ls_of_ls = [['芝士', '酸奶', '蛋糕', '巧克力', '做', '吃'],\n",
    "            ['文本', '数据', '挖掘', '分析', '做', '玩'],\n",
    "            ['佛山', '广州', '南海', '天河', '吃', '玩']]\n",
    "ls_of_words = []  # 存放分词列表（假设是jieba.lcut后得到的）的列表\n",
    "for i in range(2500):\n",
    "    ls = choice(ls_of_ls)\n",
    "    ls_of_words.append([choice(ls) for _ in range(9, 15)])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Software\\Anaconda3\\lib\\site-packages\\gensim\\utils.py:1209: UserWarning: detected Windows; aliasing chunkize to chunkize_serial\n",
      "  warnings.warn(\"detected Windows; aliasing chunkize to chunkize_serial\")\n"
     ]
    }
   ],
   "source": [
    "\"\"\"建模训练\"\"\"\n",
    "from gensim.models import Word2Vec\n",
    "model = Word2Vec(ls_of_words, size=3, window=7)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Software\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:3: DeprecationWarning: Call to deprecated `__getitem__` (Method will be removed in 4.0.0, use self.wv.__getitem__() instead).\n",
      "  This is separate from the ipykernel package so we can avoid doing imports until\n"
     ]
    }
   ],
   "source": [
    "\"\"\"词向量聚类（基于密度）\"\"\"\n",
    "from sklearn.cluster import DBSCAN\n",
    "vectors = [model[word] for word in model.wv.index2word]\n",
    "labels = DBSCAN(eps=0.24, min_samples=3).fit(vectors).labels_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\"\"\"词向量可视化\"\"\"\n",
    "%matplotlib inline\n",
    "import matplotlib\n",
    "from mpl_toolkits import mplot3d\n",
    "import matplotlib.pyplot as mp\n",
    "mp.rcParams['font.sans-serif'] = ['SimHei']  # 显示中文\n",
    "matplotlib.rcParams['axes.unicode_minus'] = False  # 显示负号\n",
    "fig = mp.figure()\n",
    "ax = mplot3d.Axes3D(fig)  # 创建3d坐标轴\n",
    "colors = ['red', 'blue', 'green', 'black']\n",
    "for word, vector, label in zip(model.wv.index2word, vectors, labels):\n",
    "    ax.scatter(vector[0], vector[1], vector[2], c=colors[label], s=500, alpha=0.4)\n",
    "    ax.text(vector[0], vector[1], vector[2], word, ha='center', va='center')\n",
    "mp.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 词矩阵可视化\n",
    "词向量可解释性：`低`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from warnings import filterwarnings\n",
    "filterwarnings('ignore')  # 不打印警告\n",
    "%matplotlib inline\n",
    "from gensim.models import Word2Vec\n",
    "from seaborn import heatmap\n",
    "from matplotlib import pyplot as mp\n",
    "from time import time"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "n, m = 10, 1000\n",
    "sentences = [\n",
    "    ''.join(chr(i) for i in range(40, 50)) * n,\n",
    "    ''.join(chr(i) for i in range(50, 60)) * n,\n",
    "    ''.join(chr(i) for i in range(60, 70)) * n,\n",
    "    ''.join(chr(i) for i in range(70, 80)) * n,\n",
    "    ''.join(chr(i) for i in range(80, 90)) * n,\n",
    "] * n * m"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "def matrix(sg, hs):\n",
    "    t = time()\n",
    "    model = Word2Vec(sentences, size=5, window=15, sg=sg, hs=hs, sorted_vocab=0, cbow_mean=0)\n",
    "    print(time() - t)\n",
    "    vectors = model.wv.vectors\n",
    "    heatmap(vectors, center=vectors.max())\n",
    "    mp.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "28.57163429260254\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "matrix(0, 0)  # CBOW + negative sampling"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "41.85939431190491\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "matrix(0, 1)  # CBOW + hierarchical softmax"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "108.22319006919861\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "matrix(1, 0)  # skip-gram + negative sampling"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "227.66502165794373\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "matrix(1, 1)  # skip-gram + hierarchical softmax"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 字向量"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "from warnings import filterwarnings\n",
    "filterwarnings('ignore')  # 不打印警告\n",
    "from jieba import lcut\n",
    "from gensim.models import Word2Vec\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "def chr2vec(word2vec=False):\n",
    "    with open('news.txt', encoding='utf-8') as f:\n",
    "        sentences = f.read().strip().split('\\n')\n",
    "        if word2vec:\n",
    "            sentences = [lcut(s) for s in sentences]\n",
    "    return Word2Vec(sentences, window=10, min_count=2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Building prefix dict from the default dictionary ...\n",
      "Loading model from cache C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\jieba.cache\n",
      "Loading model cost 6.630 seconds.\n",
      "Prefix dict has been built succesfully.\n"
     ]
    }
   ],
   "source": [
    "w2v = chr2vec(word2vec=True)  # 词向量\n",
    "c2v = chr2vec()  # 字向量"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 探究字向量和词向量嘅关系：\n",
    "`冇乜卵关系`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "get_vector = lambda model, word: model.wv.word_vec(word)\n",
    "cosine_similarity = lambda vec1, vec2: vec1 @ vec2 / (np.linalg.norm(vec1) * np.linalg.norm(vec2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 字向量和词向量关系函数\n",
    "def relationship(word):\n",
    "    v1 = get_vector(w2v, word)\n",
    "    v2 = np.sum([get_vector(c2v, c) for c in word], axis=0)\n",
    "    print('余弦相似度（字向量相加）', cosine_similarity(v1, v2))\n",
    "    v2 = np.mean([get_vector(c2v, c) for c in word], axis=0)\n",
    "    print('余弦相似度（字向量平均）', cosine_similarity(v1, v2))\n",
    "    print('相近词', w2v.similar_by_word(word, topn=2))\n",
    "    print('相近字')\n",
    "    for char in word:\n",
    "        print(c2v.similar_by_word(char, topn=2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "余弦相似度（字向量相加） -0.12177007\n",
      "余弦相似度（字向量平均） -0.12177007\n",
      "相近词 [('社交', 0.7450387477874756), ('网站', 0.7172790765762329)]\n",
      "相近字\n",
      "[('朋', 0.6749637722969055), ('谊', 0.5542399883270264)]\n",
      "[('站', 0.7652797698974609), ('友', 0.755022406578064)]\n"
     ]
    }
   ],
   "source": [
    "relationship('网络')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "余弦相似度（字向量相加） 0.13334815\n",
      "余弦相似度（字向量平均） 0.13334815\n",
      "相近词 [('同事', 0.7295631170272827), ('家人', 0.6985358595848083)]\n",
      "相近字\n",
      "[('谊', 0.7704646587371826), ('网', 0.6749637126922607)]\n",
      "[('络', 0.7550224661827087), ('站', 0.597547173500061)]\n"
     ]
    }
   ],
   "source": [
    "relationship('朋友')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "余弦相似度（字向量相加） -0.15604818\n",
      "余弦相似度（字向量平均） -0.15604822\n",
      "相近词 [('飞行', 0.8083478212356567), ('飞机', 0.7219115495681763)]\n",
      "相近字\n",
      "[('械', 0.5537397861480713), ('驶', 0.5382157564163208)]\n",
      "[('促', 0.7393168807029724), ('步', 0.6123121380805969)]\n",
      "[('绎', 0.41976726055145264), ('士', 0.381136953830719)]\n"
     ]
    }
   ],
   "source": [
    "relationship('飞行员')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 文本生成（现代文）\n",
    "效果：`差`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "def text_generate(text, model, length=25, freedom=10):\n",
    "    from random import choice\n",
    "    seq = lcut(text)\n",
    "    len_origin = len(seq)\n",
    "    for i in range(length):\n",
    "        chrs = model.predict_output_word(seq, max(freedom, len(seq)+1))\n",
    "        char = choice([i[0] for i in chrs if i[0] not in seq[len_origin:]])\n",
    "        seq.append(char)\n",
    "    return ''.join(seq[len_origin:])\n",
    "\n",
    "def generate_compare(text):\n",
    "    try:\n",
    "        print('\\033[035m词向量模型\\033[0m', text_generate(text, w2v), sep='\\n')\n",
    "        print('\\033[035m字向量模型\\033[0m', text_generate(text, c2v), sep='\\n')\n",
    "    except Exception as e:\n",
    "        print(e)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[035m词向量模型\u001b[0m\n",
      "帮忙来吃饭去餐厅打电话找哪儿送家里钱房子回家上班打工喝出门出差老人吃陪儿子外出喝酒哥哥\n",
      "\u001b[035m字向量模型\u001b[0m\n",
      "他寻找们起踪到回想我来忆追悅麼羸婺颚看跟砾跄獾蛳捋\n"
     ]
    }
   ],
   "source": [
    "generate_compare('找女朋友')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[035m词向量模型\u001b[0m\n",
      "身穿高圆圆身着唐嫣西装刘亦菲倪妮印花刘诗晏裙甜美高跟鞋外套皮草长裙蕾丝大衣粉色风衣性感白色黑色围巾镂空\n",
      "'NoneType' object is not iterable\n"
     ]
    }
   ],
   "source": [
    "generate_compare('范冰冰')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[035m词向量模型\u001b[0m\n",
      "成绩文化课初试历年考研考试大纲申论真题试题复习科目试卷备考专业课测试国考考点选择题统考答题托福听力考查题型\n",
      "'NoneType' object is not iterable\n"
     ]
    }
   ],
   "source": [
    "generate_compare('学业水平考试')"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
